package com.edu.controller;

import com.edu.commons.Constants;
import com.edu.commons.JWTUtils;
import com.edu.commons.R;
import com.edu.dto.LoginDTO;
import com.edu.dto.UpdateUserDTO;
import com.edu.pojo.User;
import com.edu.service.UserService;
import com.edu.vo.UserVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

/**
 * @ProjectName: myApp
 * @Titile: UserController
 * @Author: Administrator
 * @Description: 用户控制器
 */
@RestController
@RequestMapping("/api/user")
@Slf4j
public class UserController {
    //注入业务对象
    @Autowired
    private UserService userService;

    /**
     * 登录
     * @param loginDTO 登录数据
     * @return
     */
    @PostMapping("login") //REST API
    public R<?> login(@Validated LoginDTO loginDTO){
        log.info("有人登录:{}",loginDTO);
        //注意：生成token的业务应该放在业务层
        //生成token:假数据模拟的
        String token = JWTUtils.generateToken(new User(2, "jack"));
        System.out.println(token);
        return R.ok("登录成功",token);//只是为了测试，还是要加一个key
    }

    /**
     * 根据用户名模糊查询
     * @param name
     * @return
     */
    @GetMapping("query")  // /api/user/query?name=jack
    public R<?> getListByName(String name){
        log.info("使用问号传递传输，获取的数据:{}",name);
        return R.ok("查询成功");
    }

    /**
     * 根据用户名查询用户信息
     * @param name
     * @return
     */
    @GetMapping("{name}") // /api/user/jack
    public R<?> getListByName2(@PathVariable("name") String name){
        log.info("路径传参，获取的路径参数:{}",name);
        return R.ok("查询成功");
    }

    /**
     * 根据用户编号删除用户
     * @param userId
     * @return
     */
    @DeleteMapping("{userId}") // /api/user/1
    public R<?> deleteById(@PathVariable("userId") Integer userId){
        log.info("需要删除的用户编号:{}",userId);
        return R.ok("删除成功");
    }

    /**
     * 修改用户信息
     * @param userDTO
     * @return
     */
    @PutMapping("update")
    public R<?> update( UpdateUserDTO userDTO){
        log.info("需要修改的用户信息:{}",userDTO);
        userDTO.setUserName("heiWa");
        return R.ok("修改成功",userDTO);
    }

    @GetMapping("order")  // /api/user/order
    public R<UserVO> getUserOrderInfo(HttpServletRequest request){
        log.info("---查询个人订单详情业务---");
        //代码执行达到这一步，说明已经通过拦截器了,token是合法的。
        //从请求头中获取用户身份
        String token = request.getHeader(Constants.AUth_TOKEN);//建议使用静态常量
        //解析token的方法中，包含了token校验
        User user = JWTUtils.parseToken(token);
        UserVO userOrderInfo = userService.getUserOrderInfo(user.getUserId());
        //代码执行到这里说明是有订单详情数据的
        return R.ok("查询个人订单成功",userOrderInfo);
    }
}
